【小ネタ】nvimで突然textlintがエラーを吐くようになった時にやったこと
こんにちは、AWS 事業本部コンサルティング部に所属している今泉(@bun76235104)です。
私は平時nvimを利用しており、ブログ記事を書く際にはtextlintを利用して、おかしな文章を極力少なくしようとしています。
ある日nvimを利用している際に、それまで動かしていたtextlinが急にエラーが表示されるようになりました。
地味にハマってしまったので、ハマりポイントを共有します。
先に結論
時間がない方はこちらだけご覧ください。
よくあることですが、nvim上で動作しているtextlintとターミナル上で実行するtextlintが異なっていました。
# ターミナル上でのこの結果と which textlint # nvim上でのこのコマンドの結果が異なる :!which textlint
症状
私はnvimプラグインのnull-ls.nvimを利用して、textlintをLSPのシステムに乗せて、マークダウンを編集中に非同期でチェックするしくみを導入しています。(参考:【Neovim】null-lsを利用してtextlintを動かす)
以下のようにtextlintが発見した修正すべき点をnvimに表示させているような形です。
ところがある日nvimの設定ファイルを見直しているタイミングで、以下のようなエラーがnvim上で表示され、textlintが正しく動作しなくなりました。
Error Failed to load textlint's preset module: "ja-technical-writing" is not found. See FAQ: https://github.com/textlint/textlint/blob/master/docs/faq/failed-to-load-textlints-module.md Stack trace ReferenceError: Failed to load textlint's preset module: "ja-technical-writing" is not found. See FAQ: https://github.com/textlint/textlint/blob/master/docs/faq/failed-to-load-textlints-module.md
解決に至るまでに試したこと
私はtextlintをnpmでグローバルにインストールしています。
以下コマンドで、textlintがターミナル上で実行できることを確認しました。
textlint --preset ja-technical-writing test.md
以下のように指摘してくれます。
textlintやtextlintで利用するモジュールは利用できる状態だということがわかります。
ではnvim上とターミナル上で実行しているtextlintコマンドが異なるのではという気づきを得ました。
ということでターミナル上とnvim上で実行しているtextlintのパスを調べてみました。
# ターミナル上 which texlint > /opt/homebrew/bin/textlint
次にnvimでコマンドを実行します。
!which textlint > /Users/ユーザー名/.local/share/nvim/mason/bin/textlint
明らかに実行しているパスが違いますね。
原因・解決方法
私はmason.nvimというLSPサーバーを簡単に管理できるプラグインを利用しています。
以下のようにnvim上で:Mason
コマンドを実行することで、グラフィカルにLSPサーバーをインストール可能です。
おそらくこの画面でLSPを管理している時に、誤ってtextlintをインストールしてしまったようです。
nvim上で以下コマンドを実行してtextlintのLSPサーバーをアンインストールしました。
:MasonUninstall textlint
そして、確認のためもう一度nvim上で実行されているtextlintのパスを確認します。
:!which textlint > /opt/homebrew/bin/textlint
意図したパスのtextlintが実行され、無事nvim上にtextlintの指摘が表示されるようになりました。
まとめ
自分が意図しているコマンドと実行されるコマンドが異なるという、お手本のような事例でした。
今回はmason.nvimでインストールしたLSPサーバーが原因でした。
「ローカルインストールしたモジュールを実行しているつもりが、グローバルにインストールしたモジュールを実行していた」ということも良くありますので、皆さんもお気を付けください。